﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаСервере
Перем ПодчиненныеСправочники;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УстановитьУсловноеОформление();
	
	ЗаполнитьОбъектыСКомандамиПечати();
	ЗаполнитьСписокМакетовПоРазделам();
	
	Если Параметры.Свойство("ПоказыватьТолькоПользовательскиеИзмененные") Тогда
		ОтборПоИспользованиюМакета = "ИспользуемыеИзмененные";
	Иначе
		ОтборПоИспользованиюМакета = Элементы.ОтборПоИспользованиюМакета.СписокВыбора[0].Значение;
	КонецЕсли;
	
	ЕстьПравоИзменения = ПравоДоступа("Изменение", Метаданные.РегистрыСведений.ПользовательскиеМакетыПечати);
	Если Не ЕстьПравоИзменения Тогда
		ТекстСообщения = НСтр("ru = 'Недостаточно прав для изменения макетов.'");
		СтандартнаяОбработка = Ложь;
		ВызватьИсключение ТекстСообщения;
	КонецЕсли;
	
	ЕстьДополнительныеЯзыки = Ложь;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
		МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
			МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
			ДополнительныеЯзыкиПечатныхФорм = МодульУправлениеПечатьюМультиязычность.ДополнительныеЯзыкиПечатныхФорм();
			
			Элементы.ОтборПоЯзыку.СписокВыбора.Добавить("", НСтр("ru = 'Все'"));
			Для Каждого Язык Из ДополнительныеЯзыкиПечатныхФорм Цикл
				ПредставлениеЯзыка = МодульМультиязычностьСервер.ПредставлениеЯзыка(Язык);
				Элементы.ОтборПоЯзыку.СписокВыбора.Добавить(ПредставлениеЯзыка);
			КонецЦикла;
			
			ЕстьДополнительныеЯзыки = ДополнительныеЯзыкиПечатныхФорм.Количество() > 0;
		КонецЕсли;
	КонецЕсли;
	
	Элементы.ГруппаДополнительнаяИнформация.Видимость = ЕстьДополнительныеЯзыки;
	Элементы.ОтборПоЯзыку.Видимость = ЕстьДополнительныеЯзыки;
	Элементы.МакетыДоступныеЯзыки.Видимость = ЕстьДополнительныеЯзыки;
	Элементы.МакетыДоступенПеревод.Видимость = ЕстьДополнительныеЯзыки;
	
	РежимОткрытияМакетаПросмотр = Ложь;

	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		РежимОткрытияМакетаПросмотр = Истина;
		Элементы.ГруппаОтборы.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
	КонецЕсли;
	
	АвтоНавигационнаяСсылка = Ложь;
	НавигационнаяСсылка = "e1cib/list/РегистрСведений.ПользовательскиеМакетыПечати";
	
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	ПерейтиКЭлементу(ПозицияВДереве);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если (ИмяСобытия = "Запись_ТабличныйДокумент" Или ИмяСобытия = "Запись_ОфисныйДокумент" 
		Или ИмяСобытия = "Запись_ПользовательскиеМакетыПечати") И Источник.ВладелецФормы = ЭтотОбъект Тогда
		Если Не ТолькоПросмотр Тогда
			ИдентификаторыИзмененныхСтрок = ОбновитьОтображениеМакета(Параметр);
			Если Элементы.Макеты.ТекущиеДанные <> Неопределено И Элементы.Макеты.ТекущиеДанные.ЭтоГруппа Тогда
				Элементы.Макеты.ТекущаяСтрока = ИдентификаторыИзмененныхСтрок[Элементы.Макеты.ТекущиеДанные.ПолучитьИдентификатор()];
			Иначе
				Для Каждого Элемент Из ИдентификаторыИзмененныхСтрок Цикл
					Элементы.Макеты.ТекущаяСтрока = Элемент.Значение;
					Прервать;
				КонецЦикла;
			КонецЕсли;
			Если Элементы.Макеты.ТекущиеДанные <> Неопределено Тогда
				Элементы.Макеты.ТекущиеДанные.СоответствуетОтбору = Истина;
			КонецЕсли;
		КонецЕсли;
		УстановитьДоступностьКнопокКоманднойПанели();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ОбновитьОтображениеМакета(Знач Параметр)
	
	ИдентификаторыИзмененныхСтрок = Новый Соответствие;
	ИдентификаторМакета = Параметр.ИмяОбъектаМетаданныхМакета;
	ИсточникиДанных = ?(Параметр.Свойство("ИсточникиДанных"),
		Параметр.ИсточникиДанных, Новый Массив);
	
	НайденныеМакеты = НайтиМакеты(ИдентификаторМакета, Макеты);
	Для Каждого Макет Из НайденныеМакеты Цикл
		ИсточникДанных = Макет.ПолучитьРодителя();
		Если СтрНачинаетсяС(ИсточникДанных.Идентификатор, "Обработка")
			Или СтрНачинаетсяС(ИсточникДанных.Идентификатор, "Отчет") Тогда
			ИсточникиДанных.Добавить(ИсточникДанных.Владелец);
		КонецЕсли;
		
		Если ИсточникиДанных.Найти(ИсточникДанных.Владелец) = Неопределено Тогда
			ИсточникДанных.ПолучитьЭлементы().Удалить(Макет);
			ОчиститьКэш(ИсточникДанных.Идентификатор, ОбъектыСКомандамиПечати);
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого ИсточникДанных Из ИсточникиДанных Цикл
		ВеткиВладельцаМакетов = НайтиВеткиВладельцаМакетов(ИсточникДанных, Макеты);
		Для Каждого Ветка Из ВеткиВладельцаМакетов Цикл
			Если Ветка.ПолучитьЭлементы().Количество() > 0 И Не ЗначениеЗаполнено(Ветка.ПолучитьЭлементы()[0].Идентификатор) Тогда
				Продолжить;
			КонецЕсли;
			
			ОчиститьКэш(Ветка.Идентификатор, ОбъектыСКомандамиПечати);
			
			Макет = НайтиМакет(ИдентификаторМакета, Ветка);
			Если Макет = Неопределено Тогда
				РегистрыСведений.ПользовательскиеМакетыПечати.ДобавитьПользовательскиеМакеты(Ветка.ПолучитьЭлементы(), ИдентификаторМакета);
				Макет = НайтиМакет(ИдентификаторМакета, Ветка);
				Макет.СоответствуетОтбору = Истина;
				ИдентификаторыИзмененныхСтрок.Вставить(Ветка.ПолучитьИдентификатор(), Макет.ПолучитьИдентификатор());
				Продолжить;
			КонецЕсли;
			
			ИдентификаторыИзмененныхСтрок.Вставить(Ветка.ПолучитьИдентификатор(), Макет.ПолучитьИдентификатор());
			
			Макет.Изменен = Не Макет.Поставляемый Или УправлениеПечатью.ИспользуетсяПользовательскийМакет(ИдентификаторМакета);
			Макет.ИспользуетсяИзмененный = Макет.Изменен;
			Макет.ДоступныеЯзыки = РегистрыСведений.ПользовательскиеМакетыПечати.ДоступныеЯзыкиМакета(Параметр.ИмяОбъектаМетаданныхМакета);
			Макет.КартинкаИспользования = -1;
			Если Макет.Изменен Тогда
				Макет.КартинкаИспользования = Число(Макет.Изменен) + Число(Макет.ИспользуетсяИзмененный);
			КонецЕсли;
			Если Параметр.Свойство("Представление") Тогда
				Макет.Представление = Параметр.Представление;
			КонецЕсли;
	
		КонецЦикла;
	КонецЦикла;
	
	Возврат ИдентификаторыИзмененныхСтрок;
	
КонецФункции

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	Параметр = Новый Структура("Отказ", Ложь);
	Оповестить("ЗакрытиеФормыВладельца", Параметр, ЭтотОбъект);
	
	Если Параметр.Отказ Тогда
		Отказ = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	УстановитьОтборМакетов();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ОтборПоЯзыкуПриИзменении(Элемент)
	
	ОбновитьВидимостьМакетов();
	
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка)
	
	ОбновитьВидимостьМакетов();
	
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	СтрокаПоиска = Текст;
	
	ОбновитьВидимостьМакетов();
	
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
	
	Если ЗначениеЗаполнено(СтрокаПоиска) И Элементы.СтрокаПоиска.СписокВыбора.НайтиПоЗначению(СтрокаПоиска) = Неопределено Тогда
		Элементы.СтрокаПоиска.СписокВыбора.Добавить(СтрокаПоиска);
	КонецЕсли;
	
	ОбновитьВидимостьМакетов();
	
КонецПроцедуры

&НаКлиенте
Процедура ОтборПоВидуИспользуемогоМакетаПриИзменении(Элемент)
	УстановитьОтборМакетов();
КонецПроцедуры

&НаКлиенте
Процедура ОтборПоИспользованиюМакетаОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ОтборПоИспользованиюМакета = Элементы.ОтборПоИспользованиюМакета.СписокВыбора[0].Значение;
	УстановитьОтборМакетов();
КонецПроцедуры

&НаКлиенте
Процедура ДополнительнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
		МодульУправлениеПечатьюМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюМультиязычностьКлиент");
		МодульУправлениеПечатьюМультиязычностьКлиент.ДополнительнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
	КонецЕсли;
	
КонецПроцедуры
	
#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыМакеты

&НаКлиенте
Процедура МакетыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТекущиеДанные.ЭтоГруппа Тогда
		Возврат;
	КонецЕсли;
		
	Если Поле.Имя = "МакетыКнопкаНастройкиДоступности" Тогда
		УсловияДоступности(Неопределено);
	Иначе
		ОткрытьМакетПечатнойФормы();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура МакетыПриАктивизацииСтроки(Элемент)
	
	ПозицияВДереве = ПутьКМакетуВДереве(Элементы.Макеты.ТекущиеДанные);
	ОтключитьОбработчикОжидания("УстановитьДоступностьКнопокКоманднойПанели");
	ПодключитьОбработчикОжидания("УстановитьДоступностьКнопокКоманднойПанели", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура МакетыПриИзменении(Элемент)
	
	ТекущиеДанные = Элемент.ТекущиеДанные;
	Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
		УстановитьИспользованиеМакета(ТекущиеДанные.Ссылка, ТекущиеДанные.Используется);
		НайденныеМакеты = НайтиМакеты(ТекущиеДанные.Идентификатор, Макеты);
		Для Каждого Макет Из НайденныеМакеты Цикл
			Макет.Используется = ТекущиеДанные.Используется;
		КонецЦикла;
		ОчиститьКэш(ТекущиеДанные.ПолучитьРодителя().Идентификатор, ОбъектыСКомандамиПечати);
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура УстановитьИспользованиеМакета(Макет, Используется)
	
	Справочники.МакетыПечатныхФорм.УстановитьИспользованиеМакета(Макет, Используется);
	ОбновитьПовторноИспользуемыеЗначения();
	
КонецПроцедуры

&НаКлиенте
Процедура МакетыПередРазворачиванием(Элемент, Строка, Отказ)

	КоллекцияЭлементов = Макеты.НайтиПоИдентификатору(Строка).ПолучитьЭлементы();
	Если КоллекцияЭлементов.Количество() > 0 И Не ЗначениеЗаполнено(КоллекцияЭлементов[0].Идентификатор) Тогда
		Отказ = Истина;
		РазворачиваемыеВетки = РазворачиваемыеВетки + Формат(Строка, "ЧГ=0;") + ";";
		ПодключитьОбработчикОжидания("Подключаемый_РазвернутьВетки", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РазвернутьВетки()
	
	ЗагрузитьПодчиненныеЭлементы(РазворачиваемыеВетки);
	
	Для Каждого ИдентификаторСтроки Из СтрРазделить(РазворачиваемыеВетки, ";", Ложь) Цикл
		Ветка = Макеты.НайтиПоИдентификатору(ИдентификаторСтроки);
		ОтметитьЭлементыСоответствующиеОтбору(Ветка);
		Элементы.Макеты.Развернуть(ИдентификаторСтроки);
	КонецЦикла;
	
	РазворачиваемыеВетки = "";
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьПодчиненныеЭлементы(ИдентификаторыСтрок)
	
	Для Каждого ИдентификаторСтроки Из СтрРазделить(ИдентификаторыСтрок, ";", Ложь) Цикл
		ТекущиеДанные = Макеты.НайтиПоИдентификатору(ИдентификаторСтроки);
		КоллекцияЭлементов = ТекущиеДанные.ПолучитьЭлементы();
	
		Если КоллекцияЭлементов.Количество() = 0 Или ЗначениеЗаполнено(КоллекцияЭлементов[0].Идентификатор) Тогда
			Продолжить;
		КонецЕсли;
		
		КоллекцияЭлементов.Очистить();
		
		ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ТекущиеДанные.Идентификатор);
		Если ОбъектМетаданных = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		ВывестиМакеты(ТекущиеДанные);
		
		Если ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных) Тогда
			ВывестиКоллекцию(ТекущиеДанные, ОбъектМетаданных.РегистрируемыеДокументы);
		ИначеЕсли ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) Тогда 
			ВывестиКоллекцию(ТекущиеДанные, ПодчиненныеСправочники(ОбъектМетаданных));
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ИзменитьМакет(Команда)
	ОткрытьМакетПечатнойФормыДляРедактирования();
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьИзмененныйМакет(Команда)
	ПереключитьИспользованиеВыбранныхМакетов(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьСтандартныйМакет(Команда)
	ПереключитьИспользованиеВыбранныхМакетов(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьМакет(Команда)
	
	ПараметрыОповещения = Новый Структура("Копирование, ТипМакета", Ложь, "MXL");
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения);
	УникальноеНаименование = ПолучитьУникальноеНаименование(НСтр("ru = 'Новая печатная форма'"), Ложь);
	ПоказатьВводСтроки(ОписаниеОповещения, УникальноеНаименование, НСтр("ru = 'Введите наименование макета'"), 100, Ложь)
	
КонецПроцедуры

&НаКлиенте
Процедура ПерейтиВСписок(Команда)
	ПерейтиКСписку();
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьМакетOfficeOpenXML(Команда)
	
	ПараметрыОповещения = Новый Структура("Копирование, ТипМакета", Ложь, "DOCX");
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения);
	УникальноеНаименование = ПолучитьУникальноеНаименование(НСтр("ru = 'Новая печатная форма'"), Ложь);
	ПоказатьВводСтроки(ОписаниеОповещения, УникальноеНаименование, НСтр("ru = 'Введите наименование макета'"), 100, Ложь)
	
КонецПроцедуры


&НаКлиенте
Процедура УсловияДоступности(Команда)
	
	ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыОткрытия = Новый Структура("Ключ", ТекущиеДанные.Ссылка);
	
	ОткрытьФорму("Справочник.МакетыПечатныхФорм.Форма.УсловияВидимостиВПодменюПечать", ПараметрыОткрытия, ЭтотОбъект);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область Отборы

&НаКлиенте
Процедура УстановитьОтборМакетов();

	ПоказыватьИзмененные = Истина;
	ПоказыватьНеизмененные = Истина;
	ПоказыватьИспользуемые = Истина;
	ПоказыватьНеиспользуемые = Истина;
	
	Если ОтборПоИспользованиюМакета = "Измененные" Тогда
		ПоказыватьНеизмененные = Ложь;
	ИначеЕсли ОтборПоИспользованиюМакета = "НеИзмененные" Тогда
		ПоказыватьИзмененные = Ложь;
	ИначеЕсли ОтборПоИспользованиюМакета = "ИспользуемыеИзмененные" Тогда
		ПоказыватьНеиспользуемые = Ложь;
		ПоказыватьНеИзмененные = Ложь;
	ИначеЕсли ОтборПоИспользованиюМакета = "НеИспользуемыеИзмененные" Тогда
		ПоказыватьНеизмененные = Ложь;
		ПоказыватьИспользуемые = Ложь;
	КонецЕсли;
	
	ОбновитьВидимостьМакетов();
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьВидимостьМакетов(Интервал = 0.5);
	
	ОтключитьОбработчикОжидания("ПрименитьОтбор");
	ПодключитьОбработчикОжидания("ПрименитьОтбор", Интервал, Истина);
	
КонецПроцедуры

#КонецОбласти

// Открытие макета

&НаКлиенте
Процедура ОткрытьМакетПечатнойФормы()
	
	Если РежимОткрытияМакетаПросмотр Тогда
		ОткрытьМакетПечатнойФормыДляПросмотра();
	Иначе
		ОткрытьМакетПечатнойФормыДляРедактирования();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьМакетПечатнойФормыДляПросмотра()
	
	ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
	
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
	ПараметрыОткрытия.Вставить("ТипМакета", ТекущиеДанные.ТипМакета);
	ПараметрыОткрытия.Вставить("ТолькоОткрытие", Истина);
	
	Если ТекущиеДанные.ТипМакета = "MXL" Тогда
		ПараметрыОткрытия.Вставить("ИмяДокумента", ТекущиеДанные.Представление);
		ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия, ЭтотОбъект);
		Возврат;
	ИначеЕсли ТекущиеДанные.ТипМакета = "DOCX" Тогда
		Если ВерсияМакета(ТекущиеДанные.Идентификатор, ТекущиеДанные.ТипМакета) = "Области" Тогда
			ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект);
			Возврат;
		КонецЕсли;
		ПараметрыОткрытия.Вставить("ИмяДокумента", ТекущиеДанные.Представление);
		ПараметрыОткрытия.Вставить("Редактирование", Ложь);
		ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект);
		Возврат;	
	КонецЕсли;
	
	ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьМакетПечатнойФормыДляРедактирования()
	
	ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
	
	Если ТекущиеДанные.Изменен И Не ТекущиеДанные.ИспользуетсяИзмененный Тогда
		ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьМакетПечатнойФормыДляРедактированияПродолжение", ЭтотОбъект, ТекущиеДанные);
		ТекстВопроса = НСтр("ru = 'Имеется измененный макет, но он не используется.
		|Можно переключиться на него и продолжить редактирование,
		|либо начать редактирование стандартного макета.'");
		
		Кнопки = Новый СписокЗначений();
		Кнопки.Добавить(Истина, НСтр("ru = 'Измененный ранее'"));
		Кнопки.Добавить(Ложь, НСтр("ru = 'Стандартный (текущий)'"));
		Кнопки.Добавить(Неопределено, НСтр("ru = 'Отмена'"));
		
		ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , , НСтр("ru = 'Какой макет редактировать?'"));
		Возврат;
	КонецЕсли;
	
	ОткрытьМакетПечатнойФормыДляРедактированияПродолжение(Ложь, ТекущиеДанные);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьМакетПечатнойФормыДляРедактированияПродолжение(ПереключитьИспользование, ТекущиеДанные) Экспорт

	Если ПереключитьИспользование = Неопределено Тогда
		Возврат;
	ИначеЕсли ПереключитьИспользование Тогда
		ПереключитьИспользованиеВыбранныхМакетов(Истина);
	КонецЕсли;
	
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
	ПараметрыОткрытия.Вставить("ТипМакета", ТекущиеДанные.ТипМакета);
	ПараметрыОткрытия.Вставить("Ссылка", ТекущиеДанные.Ссылка);
	ПараметрыОткрытия.Вставить("ИсточникДанных", ТекущиеДанные.Владелец);
	ПараметрыОткрытия.Вставить("ИсточникиДанных", ТекущиеДанные.ИсточникиДанных);
	ПараметрыОткрытия.Вставить("ЭтоПечатнаяФорма", ТекущиеДанные.ЭтоПечатнаяФорма);
	ПараметрыОткрытия.Вставить("ДоступноНазначение", Не ТекущиеДанные.Поставляемый);
	
	Если ТекущиеДанные.ТипМакета = "MXL" Тогда
		ПараметрыОткрытия.Вставить("ИмяДокумента", ТекущиеДанные.Представление);
		ПараметрыОткрытия.Вставить("Редактирование", Не ТолькоПросмотр);
		ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия, ЭтотОбъект);
		Возврат;
	ИначеЕсли ТекущиеДанные.ТипМакета = "DOCX" Тогда
		Если ВерсияМакета(ТекущиеДанные.Идентификатор, ТекущиеДанные.ТипМакета) = "Области" Тогда
			ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект);
			Возврат;
		КонецЕсли;
		ПараметрыОткрытия.Вставить("ИмяДокумента", ТекущиеДанные.Представление);
		ПараметрыОткрытия.Вставить("Редактирование", Истина);
		ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект);
		Возврат;	
	КонецЕсли;
	
	ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект);
	
КонецПроцедуры

// Действия с макетами

&НаСервереБезКонтекста
Функция ВерсияМакета(Идентификатор, ТипМакета)
	Макет = УправлениеПечатью.МакетПечатнойФормы(Идентификатор);
	ДанныеМакета = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(Макет, ТипМакета);
	
	Если ДанныеМакета.СтруктураДокумента.ОбластиДокумента.Количество() > 1 
		ИЛИ ДанныеМакета.СтруктураДокумента.ОбластиДокумента["Абзац"] = Неопределено Тогда
		ВерсияМакета = "Области";
	Иначе
		ВерсияМакета = "Параметры";
	КонецЕсли;
	
	ДанныеМакета.Вставить("ВерсияМакета", ВерсияМакета);
	Возврат ДанныеМакета.ВерсияМакета;
КонецФункции

&НаКлиенте
Процедура ПереключитьИспользованиеВыбранныхМакетов(ИспользуетсяИзмененный)
	ПереключаемыеМакеты = Новый Массив;
	Для Каждого ВыделеннаяСтрока Из Элементы.Макеты.ВыделенныеСтроки Цикл
		ТекущиеДанные = Элементы.Макеты.ДанныеСтроки(ВыделеннаяСтрока);
		Если ТекущиеДанные.Изменен Тогда
			ТекущиеДанные.ИспользуетсяИзмененный = ИспользуетсяИзмененный;
			УстановитьКартинкуИспользования(ТекущиеДанные);
			ПереключаемыеМакеты.Добавить(ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
		КонецЕсли;
	КонецЦикла;
	УстановитьИспользованиеИзмененныхМакетов(ПереключаемыеМакеты, ИспользуетсяИзмененный);
	УстановитьДоступностьКнопокКоманднойПанели();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура УстановитьИспользованиеИзмененныхМакетов(Макеты, ИспользуетсяИзмененный)
	
	РегистрыСведений.ПользовательскиеМакетыПечати.УстановитьИспользованиеИзмененныхМакетов(Макеты, ИспользуетсяИзмененный);
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьВыбранныеИзмененныеМакеты(Команда)
	УдаляемыеМакеты = Новый Массив;
	Для Каждого ВыделеннаяСтрока Из Элементы.Макеты.ВыделенныеСтроки Цикл
		ТекущиеДанные = Элементы.Макеты.ДанныеСтроки(ВыделеннаяСтрока);
		ТекущиеДанные.ИспользуетсяИзмененный = Ложь;
		ТекущиеДанные.Изменен = Ложь;
		ТекущиеДанные.ДоступныеЯзыки = "";
		УстановитьКартинкуИспользования(ТекущиеДанные);
		УдаляемыеМакеты.Добавить(ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
	КонецЦикла;
	УдалитьИзмененныеМакеты(УдаляемыеМакеты);
	УстановитьДоступностьКнопокКоманднойПанели();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура УдалитьИзмененныеМакеты(УдаляемыеМакеты)
	
	Для Каждого ИмяОбъектаМетаданныхМакета Из УдаляемыеМакеты Цикл
		УправлениеПечатью.УдалитьМакет(ИмяОбъектаМетаданныхМакета);
	КонецЦикла;
	
КонецПроцедуры

// Общие

&НаКлиенте
Процедура УстановитьКартинкуИспользования(ОписаниеМакета)
	ОписаниеМакета.КартинкаИспользования = -1;
	Если ОписаниеМакета.Изменен Тогда
		ОписаниеМакета.КартинкаИспользования = Число(ОписаниеМакета.Изменен) + Число(ОписаниеМакета.ИспользуетсяИзмененный);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьКнопокКоманднойПанели()
	
	ТекущийМакет = Элементы.Макеты.ТекущиеДанные;
	ТекущийМакетВыбран = ТекущийМакет <> Неопределено;
	ВыбраноНесколькоМакетов = Элементы.Макеты.ВыделенныеСтроки.Количество() > 1;
	
	ИспользоватьИзмененныйМакетДоступность  = Ложь;
	ИспользоватьСтандартныйМакетДоступность = Ложь;
	УдалитьИзмененныйМакетДоступность       = Ложь;
	УдалитьМакетВидимость                   = Ложь;
	ДоступноОтображениеВСписке              = Ложь;
	
	Для Каждого ВыделеннаяСтрока Из Элементы.Макеты.ВыделенныеСтроки Цикл
		ТекущийМакет = Элементы.Макеты.ДанныеСтроки(ВыделеннаяСтрока);
		ИспользоватьИзмененныйМакетДоступность = ТекущийМакетВыбран И ТекущийМакет.Изменен И Не ТекущийМакет.ИспользуетсяИзмененный И Не ЗначениеЗаполнено(ТекущийМакет.Ссылка) Или ВыбраноНесколькоМакетов И ИспользоватьИзмененныйМакетДоступность;
		ИспользоватьСтандартныйМакетДоступность = ТекущийМакетВыбран И ТекущийМакет.Изменен И ТекущийМакет.ИспользуетсяИзмененный И Не ЗначениеЗаполнено(ТекущийМакет.Ссылка) Или ВыбраноНесколькоМакетов И ИспользоватьСтандартныйМакетДоступность;
		УдалитьИзмененныйМакетДоступность = ТекущийМакетВыбран И ТекущийМакет.Изменен  И Не ЗначениеЗаполнено(ТекущийМакет.Ссылка) Или ВыбраноНесколькоМакетов И УдалитьИзмененныйМакетДоступность;
		УдалитьМакетВидимость = ТекущийМакетВыбран И ЗначениеЗаполнено(ТекущийМакет.Ссылка) Или ВыбраноНесколькоМакетов И УдалитьМакетВидимость;
		
		ИсточникиДанных = СтрРазделить(ТекущийМакет.ИсточникиДанных, ",", Ложь);
		Для Каждого ИсточникДанных Из ИсточникиДанных Цикл
			Если СтрНачинаетсяС(ИсточникДанных, "Обработка") 
				Или СтрНачинаетсяС(ИсточникДанных, "Отчет")
				Или ИсточникДанных = "ОбщийМакет" Тогда
				Продолжить;
			КонецЕсли;
			ДоступноОтображениеВСписке = Истина;
		КонецЦикла;
	КонецЦикла;
	
	Элементы.МакетыПечатныхФормИспользоватьИзмененныйМакет.Доступность = ИспользоватьИзмененныйМакетДоступность;
	Элементы.МакетыПечатныхФормИспользоватьСтандартныйМакет.Доступность = ИспользоватьСтандартныйМакетДоступность;
	Элементы.МакетыПечатныхФормУдалитьИзмененныйМакет.Доступность = УдалитьИзмененныйМакетДоступность;
	
	Элементы.МакетыКонтекстноеМенюУдалитьИзмененныйМакет.Видимость = УдалитьИзмененныйМакетДоступность И Не ТолькоПросмотр;
	Элементы.МакетыКонтекстноеМенюУдалитьМакет.Видимость = УдалитьМакетВидимость И Не ТолькоПросмотр;
	Элементы.МакетыУсловияДоступности.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступнаНастройкаВидимости;
	Элементы.МакетыСкопировать.Доступность = ТекущийМакетВыбран И ТекущийМакет.ЭтоПечатнаяФорма И Не ВыбраноНесколькоМакетов И ТекущийМакет.ДоступноСоздание И Не ТолькоПросмотр;
	Элементы.МакетыДобавитьМакет.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступноСоздание;
	Элементы.МакетыДобавитьМакетOfficeOpenXML.Доступность = ТекущийМакетВыбран И ТекущийМакет.ДоступноСоздание;
	Элементы.МакетыИзменитьМакет.Доступность = ТекущийМакетВыбран И Не ТекущийМакет.ЭтоГруппа;
	Элементы.ФормаПоказатьВСписке.Доступность = ДоступноОтображениеВСписке;
	
КонецПроцедуры

&НаКлиенте
Процедура Скопировать(Команда)
	
	ПараметрыОповещения = Новый Структура("Копирование, ТипМакета", Истина);
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект, ПараметрыОповещения);
	ТекущийМакет = Элементы.Макеты.ТекущиеДанные;
	НаименованиеКопии = ПолучитьУникальноеНаименование(ТекущийМакет.Представление);
	ПоказатьВводСтроки(ОписаниеОповещения, НаименованиеКопии, НСтр("ru = 'Введите наименование макета'"), 100, Ложь)
	
КонецПроцедуры

&НаСервере
Функция ПолучитьУникальноеНаименование(НаименованиеМакета, ЭтоКопирование = Истина)
	
	НовоеНаименование = НаименованиеМакета;
	ОкончаниеКопии = "";
	Счетчик = 1;
	ДеревоМакетов = ДанныеФормыВЗначение(Макеты, Тип("ДеревоЗначений"));
	Пока ДеревоМакетов.Строки.Найти(НовоеНаименование + ОкончаниеКопии, "Представление", Истина) <> Неопределено Цикл
		Если ЭтоКопирование Тогда
			ОкончаниеКопии = " - " + НСтр("ru = 'копия'");
		Иначе
			ОкончаниеКопии = "";
		КонецЕсли;
		
		Если Счетчик > 1 Тогда
			ОкончаниеКопии = ОкончаниеКопии + " ("+Формат(Счетчик, "ЧДЦ=0; ЧГ=;")+")";
		КонецЕсли;
		Счетчик = Счетчик + 1;
	КонецЦикла;			
	Возврат НовоеНаименование + ОкончаниеКопии;
	
КонецФункции

&НаКлиенте
Процедура ПриВыбореИмениМакета(ИмяМакета, ПараметрыОповещения) Экспорт
	
	Копирование = ПараметрыОповещения.Копирование;
	
	Если Не ЗначениеЗаполнено(ИмяМакета) Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
	
	ТипМакета = ?(ПараметрыОповещения.ТипМакета = Неопределено, ТекущиеДанные.ТипМакета, ПараметрыОповещения.ТипМакета);
	
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("ТипМакета", ТипМакета);
	ПараметрыОткрытия.Вставить("Владелец", ?(ЗначениеЗаполнено(ТекущиеДанные.Владелец), ТекущиеДанные.Владелец, ТекущиеДанные.Идентификатор));
	ПараметрыОткрытия.Вставить("ИмяДокумента", ИмяМакета);

	Если Копирование Тогда
		ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", ТекущиеДанные.ИмяОбъектаМетаданныхМакета);
		ПараметрыОткрытия.Вставить("Копирование", Копирование);
	КонецЕсли;
	
	ПараметрыОткрытия.Вставить("ИсточникДанных", ТекущиеДанные.Владелец);
	ПараметрыОткрытия.Вставить("ЭтоПечатнаяФорма", Истина);
	ПараметрыОткрытия.Вставить("ДоступноНазначение", Истина);
	
	Если ТипМакета = "MXL" Тогда
		ПараметрыОткрытия.Вставить("Редактирование", Истина);
		ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия, ЭтотОбъект);
		Возврат;
	КонецЕсли;
	
	Если ТипМакета = "DOCX" Тогда
		ПараметрыОткрытия.Вставить("Редактирование", Истина);
		ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект);
		Возврат;
	КонецЕсли;
	
	ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПерейтиКСписку()
	
	ВладелецКоманд = Элементы.Макеты.ТекущиеДанные;
	Если ВладелецКоманд = Неопределено Или СтрНачинаетсяС(ВладелецКоманд.Идентификатор, "Подсистема") Тогда
		Возврат;
	КонецЕсли;
	
	Родитель = ВладелецКоманд.ПолучитьРодителя();
	Если Родитель <> Неопределено И Не СтрНачинаетсяС(Родитель.Идентификатор, "Подсистема") Тогда
		ВладелецКоманд = Родитель;
	КонецЕсли;
	
	НавигационнаяСсылкаСписка = ПолучитьНавигационнуюСсылкуНаФормуСписка(ВладелецКоманд.Владелец);
	Для Каждого ОкноКлиентскогоПриложения Из ПолучитьОкна() Цикл
		Если ОкноКлиентскогоПриложения.ПолучитьНавигационнуюСсылку() = НавигационнаяСсылкаСписка Тогда
			Форма = ОкноКлиентскогоПриложения.Содержимое[0];
			ОписаниеОповещения = Новый ОписаниеОповещения("ПерейтиКСпискуЗавершение", ЭтотОбъект, 
				Новый Структура("Форма, НавигационнаяСсылка", Форма, НавигационнаяСсылкаСписка));
			Кнопки = Новый СписокЗначений;
			Кнопки.Добавить("Переоткрыть", НСтр("ru = 'Переоткрыть'"));
			Кнопки.Добавить("Отмена", НСтр("ru = 'Не переоткрывать'"));
			ТекстВопроса = 
				НСтр("ru = 'Список уже открыт. Переоткрыть список, 
				|чтобы увидеть изменения меню печать?'");
			ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , "Переоткрыть");
			Возврат;
		КонецЕсли;
	КонецЦикла;
	
	ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылкаСписка);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьНавигационнуюСсылкуНаФормуСписка(ИдентификаторОбъектаМетаданных)
	Возврат  "e1cib/list/" 
		+ ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИдентификаторОбъектаМетаданных).ПолноеИмя();
КонецФункции

&НаКлиенте
Процедура ПерейтиКСпискуЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	Если РезультатВопроса = "Отмена" Тогда
		Возврат;
	КонецЕсли;
	
	ДополнительныеПараметры.Форма.Закрыть();
	ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(ДополнительныеПараметры.НавигационнаяСсылка);
КонецПроцедуры


&НаСервере
Функция НайтиМакет(Идентификатор, Знач Ветка = Неопределено)
	
	Если Ветка = Неопределено Тогда
		Ветка = Макеты;
	КонецЕсли;
	
	Для Каждого Макет Из Ветка.ПолучитьЭлементы() Цикл
		Если Макет.Идентификатор = Идентификатор Тогда
			Возврат Макет;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

&НаКлиенте
Процедура УдалитьМакет(Команда)
	
	ТекущиеДанные = Элементы.Макеты.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИдентификаторМакета = ТекущиеДанные.Идентификатор;
	УдалитьМакетНаСервере(ИдентификаторМакета);
	НайденныеМакеты = НайтиМакеты(ИдентификаторМакета, Макеты);
	Для Каждого Макет Из НайденныеМакеты Цикл
		Макет.ПолучитьРодителя().ПолучитьЭлементы().Удалить(Макет);
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура УдалитьМакетНаСервере(ИдентификаторМакета)
	
	УправлениеПечатью.УдалитьМакет(ИдентификаторМакета);
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();

	// Разделы
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("Макеты");
	
	ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Макеты.ЭтоПодраздел");
	ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветРазделаПанелиФункций);
	
	// Цвет отключенных
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты");
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.Используется");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	
	// Скрытие флажка использования для групп
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("МакетыИспользуется");
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЭтоГруппа");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	
	// Скрытие флажка использования для поставляемых макетов
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("МакетыИспользуется");
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.Поставляемый");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);	
	
	// Отбор
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты");

	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.СоответствуетОтбору");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;

	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЕстьЭлементыСоответствующиеОтбору");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
	
	// Не соответствующие отбору 
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Макеты");
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.СоответствуетОтбору");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.ЕстьЭлементыСоответствующиеОтбору");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;

	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Макеты.СтрокаПоиска");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеСодержит;
	ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("СтрокаПоиска");
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСписокМакетовПоРазделам()
	
	Макеты.ПолучитьЭлементы().Очистить();
	ВывестиКоллекцию(Макеты, Метаданные.Подсистемы);
	ЗаполнитьТаблицуМакетовПечатныхФорм(Макеты);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТаблицуМакетовПечатныхФорм(Ветка)
	
	ОбъектыСМакетами = Новый Соответствие;
	Для Каждого ОписаниеМакета Из УправлениеПечатью.МакетыПечатныхФорм(Истина) Цикл
		ОбъектыСМакетами.Вставить(ОписаниеМакета.Значение, Истина);
	КонецЦикла;
	
	ОбъектыМетаданных = Новый Массив;
	Для Каждого Объект Из ОбъектыСМакетами Цикл
		ОбъектыМетаданных.Добавить(Объект.Ключ);
	КонецЦикла;
	
	СоответствиеВладельцевМакетов = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ОбъектыМетаданных, Ложь);
	
	ВладельцыМакетов = Новый СписокЗначений();
	Для Каждого Источник Из СоответствиеВладельцевМакетов Цикл
		Если Не ЗначениеЗаполнено(Источник.Значение) Тогда
			Продолжить;
		КонецЕсли;
		ВладельцыМакетов.Добавить(Источник.Значение, Источник.Значение);
	КонецЦикла;
	
	ИдентификаторыОбъектовМетаданных = ВладельцыМакетов.ВыгрузитьЗначения();
	ЗначенияПустойСсылки = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(ИдентификаторыОбъектовМетаданных, "ЗначениеПустойСсылки");
	
	ВладельцыМакетов.СортироватьПоПредставлению();
	
	ГруппыМакетов = Новый Соответствие();
	
	ГруппаПрочие = Ветка.ПолучитьЭлементы().Добавить();
	ГруппаПрочие.Представление = НСтр("ru = 'Прочие'");
	ГруппаПрочие.КартинкаГруппы = БиблиотекаКартинок.Перечисление;
	ГруппаПрочие.Идентификатор = "ОбщиеМакеты";
	ГруппаПрочие.КартинкаИспользования = -1;
	ГруппаПрочие.ЭтоГруппа = Истина;
	ГруппаПрочие.Используется = Истина;
	ГруппаПрочие.Владелец = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
	ГруппаПрочие.СтрокаПоиска = НРег(ГруппаПрочие.Представление);
	ГруппаПрочие.ДоступноСоздание = Ложь;
	ГруппыМакетов.Вставить(Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(), ГруппаПрочие);
	
	ДоступноДобавлениеМакетов = ПравоДоступа("Добавление", Метаданные.Справочники.МакетыПечатныхФорм); 
	
	Для Каждого Владелец Из ВладельцыМакетов Цикл
		ГруппаМакетов = ГруппаПрочие.ПолучитьЭлементы().Добавить();
		ГруппаМакетов.Представление = Владелец.Представление;
		ГруппаМакетов.КартинкаГруппы = Новый Картинка;
		ГруппаМакетов.Идентификатор = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Владелец.Значение, "ПолноеИмя");
		ГруппаМакетов.КартинкаИспользования = -1;
		ГруппаМакетов.ЭтоГруппа = Истина;
		ГруппаМакетов.Используется = Истина;
		ГруппаМакетов.Владелец = Владелец.Значение;
		ГруппаМакетов.СтрокаПоиска = НРег(ГруппаМакетов.Представление);
		ГруппаМакетов.ДоступноСоздание = Ложь;
		ГруппаМакетов.ПолучитьЭлементы().Добавить();
		
		ГруппыМакетов.Вставить(Владелец.Значение, ГруппаМакетов);
	КонецЦикла;
	
	ВывестиМакеты(ГруппаПрочие);
	
КонецПроцедуры

&НаСервере
Процедура ВывестиКоллекцию(Знач Ветка, Знач КоллекцияОбъектовМетаданных)
	
	Для Каждого ОбъектМетаданных Из КоллекцияОбъектовМетаданных Цикл
		Если ТипЗнч(Ветка) = Тип("ДанныеФормыЭлементДерева") И ОбъектМетаданных.ПолноеИмя() = Ветка.Идентификатор Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ЭтоПодсистема(ОбъектМетаданных) И Не ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных)
			И ОбъектыСКомандамиПечати.НайтиПоЗначению(ОбъектМетаданных.ПолноеИмя()) = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ОбъектМетаданныхДоступен(ОбъектМетаданных) Тогда
			Продолжить;
		КонецЕсли;
		
		НоваяВетка = Ветка.ПолучитьЭлементы().Добавить();
		НоваяВетка.Представление = ОбъектМетаданных.Представление();
		НоваяВетка.КартинкаГруппы = КартинкаВИнтерфейсе(ОбъектМетаданных);
		НоваяВетка.Идентификатор = ОбъектМетаданных.ПолноеИмя();
		НоваяВетка.КартинкаИспользования = -1;
		НоваяВетка.ЭтоГруппа = Истина;
		НоваяВетка.Используется = Истина;
		НоваяВетка.СтрокаПоиска = НРег(НоваяВетка.Представление);
		
		Если ЭтоПодсистема(ОбъектМетаданных) Тогда
			ВывестиКоллекцию(НоваяВетка, ОбъектМетаданных.Состав);
			ВывестиКоллекцию(НоваяВетка, ОбъектМетаданных.Подсистемы);
			НоваяВетка.ЭтоПодраздел = КоллекцияОбъектовМетаданных <> Метаданные.Подсистемы;
		Иначе
			НоваяВетка.Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(НоваяВетка.Идентификатор, Ложь);
			НоваяВетка.ДоступноСоздание = Не ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных);
			НоваяВетка.ПолучитьЭлементы().Добавить();
		КонецЕсли;
		
		Если ЭтоПодсистема(ОбъектМетаданных) И НоваяВетка.ПолучитьЭлементы().Количество() = 0 Тогда
			Индекс = Ветка.ПолучитьЭлементы().Индекс(НоваяВетка);
			Ветка.ПолучитьЭлементы().Удалить(Индекс);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция КартинкаВИнтерфейсе(ОбъектМетаданных)
	
	СвойстваОбъекта = Новый Структура("Картинка");
	ЗаполнитьЗначенияСвойств(СвойстваОбъекта, ОбъектМетаданных);
	Если ЗначениеЗаполнено(СвойстваОбъекта.Картинка) Тогда
		Возврат СвойстваОбъекта.Картинка;
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

&НаСервереБезКонтекста
Функция ЭтоПодсистема(ОбъектМетаданных)
	Возврат СтрНачинаетсяС(ОбъектМетаданных.ПолноеИмя(), "Подсистема");
КонецФункции

&НаСервере
Функция ОбъектМетаданныхДоступен(ОбъектМетаданных)
	
	Если Не ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных)
		И Не ОбщегоНазначения.ЭтоДокумент(ОбъектМетаданных)
		И Не ОбщегоНазначения.ЭтоЖурналДокументов(ОбъектМетаданных)
		И Не ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных)
		И Не ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных)
		И Не ОбщегоНазначения.ЭтоПланСчетов(ОбъектМетаданных)
		И Не ОбщегоНазначения.ЭтоПланВидовРасчета(ОбъектМетаданных)
		И Не ОбщегоНазначения.ЭтоБизнесПроцесс(ОбъектМетаданных)
		И Не ОбщегоНазначения.ЭтоЗадача(ОбъектМетаданных)
		И Не Метаданные.Обработки.Содержит(ОбъектМетаданных)
		И Не Метаданные.Отчеты.Содержит(ОбъектМетаданных)
		И Не ЭтоПодсистема(ОбъектМетаданных) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ДоступенПоПравам = ПравоДоступа("Просмотр", ОбъектМетаданных);
	ДоступенПоФункциональнымОпциям = ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОбъектМетаданных);
	
	СвойстваМетаданного = Новый Структура("ПолнотекстовыйПоиск, ВключатьВКомандныйИнтерфейс");
	ЗаполнитьЗначенияСвойств(СвойстваМетаданного, ОбъектМетаданных);
	
	Если СвойстваМетаданного.ПолнотекстовыйПоиск = Неопределено Тогда 
		ИспользованиеПолнотекстовогоПоиска = Истина;
	Иначе 
		ИспользованиеПолнотекстовогоПоиска = (СвойстваМетаданного.ПолнотекстовыйПоиск = 
			Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.Использовать);
	КонецЕсли;
	
	Если СвойстваМетаданного.ВключатьВКомандныйИнтерфейс = Неопределено Тогда 
		ВключатьВКомандныйИнтерфейс = Истина;
	Иначе 
		ВключатьВКомандныйИнтерфейс = СвойстваМетаданного.ВключатьВКомандныйИнтерфейс;
	КонецЕсли;
	
	Возврат ДоступенПоПравам И ДоступенПоФункциональнымОпциям 
		И ИспользованиеПолнотекстовогоПоиска И ВключатьВКомандныйИнтерфейс;
	
КонецФункции

&НаСервере
Функция ПодчиненныеСправочники(ОбъектМетаданных)
	
	Если ПодчиненныеСправочники = Неопределено Тогда
		ПодчиненныеСправочники = Новый Соответствие;
		
		Для Каждого Справочник Из Метаданные.Справочники Цикл
			Если ПодчиненныеСправочники[Справочник] = Неопределено Тогда
				ПодчиненныеСправочники[Справочник] = Новый Массив;
			КонецЕсли;
			Для Каждого ВладелецСправочника Из Справочник.Владельцы Цикл
				Если ПодчиненныеСправочники[ВладелецСправочника] = Неопределено Тогда
					ПодчиненныеСправочники[ВладелецСправочника] = Новый Массив;
				КонецЕсли;
				СписокСправочников = ПодчиненныеСправочники[ВладелецСправочника]; // Массив
				СписокСправочников.Добавить(Справочник);
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	
	Возврат ПодчиненныеСправочники[ОбъектМетаданных];
	
КонецФункции

&НаСервере
Процедура ВывестиМакеты(ОписаниеОбъекта)
	
	Если Не ЗначениеЗаполнено(ОписаниеОбъекта.Идентификатор) Тогда
		Возврат;
	КонецЕсли;
	
	МакетыОбъекта = МакетыОбъекта(ОписаниеОбъекта.Идентификатор);
	Ветка = ОписаниеОбъекта;
	КоллекцияЭлементов = Ветка.ПолучитьЭлементы();
	
	Для Индекс = 0 По МакетыОбъекта.Количество() -1 Цикл
		ОписаниеМакета = МакетыОбъекта[Индекс];
		Макет = КоллекцияЭлементов.Вставить(Индекс);
		ЗаполнитьЗначенияСвойств(Макет, ОписаниеМакета);
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция МакетыОбъекта(ИмяОбъектаМетаданных)
	
	НайденныйЭлемент = ОбъектыСКомандамиПечати.НайтиПоЗначению(ИмяОбъектаМетаданных);
	Если НайденныйЭлемент = Неопределено Тогда
		НайденныйЭлемент = ОбъектыСКомандамиПечати.Добавить(ИмяОбъектаМетаданных);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(НайденныйЭлемент.Представление) Тогда
		МакетыОбъекта = ОбщегоНазначения.ЗначениеИзСтрокиXML(НайденныйЭлемент.Представление);
	Иначе
		МакетыОбъекта = РегистрыСведений.ПользовательскиеМакетыПечати.МакетыОбъекта(ИмяОбъектаМетаданных);
		НайденныйЭлемент.Представление = ОбщегоНазначения.ЗначениеВСтрокуXML(МакетыОбъекта);
	КонецЕсли;
	
	Возврат МакетыОбъекта;
	
КонецФункции

&НаСервере
Функция НайтиВеткиВладельцаМакетов(Владелец, ТекущаяВетка, НайденныеВетки = Неопределено)
	
	Если НайденныеВетки = Неопределено Тогда
		НайденныеВетки = Новый Массив;
	КонецЕсли;
	
	Для Каждого Ветка Из ТекущаяВетка.ПолучитьЭлементы() Цикл
		Если Ветка.ЭтоГруппа И Ветка.Владелец = Владелец Тогда
			НайденныеВетки.Добавить(Ветка);
		Иначе
			НайтиВеткиВладельцаМакетов(Владелец, Ветка, НайденныеВетки)
		КонецЕсли;
	КонецЦикла;
	
	Возврат НайденныеВетки;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция НайтиМакеты(Знач Идентификатор, Знач Ветка)
	
	Результат = Новый Массив;
	
	Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
		Если Элемент.Идентификатор = Идентификатор Тогда
			Результат.Добавить(Элемент);
		Иначе
			ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, НайтиМакеты(Идентификатор, Элемент));
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Процедура ПрименитьОтбор()
	
	Если ОтборУстановлен() Тогда
		ЗагрузитьСписокМакетов();
	КонецЕсли;
	
	ОтметитьЭлементыСоответствующиеОтбору();
	
	Если Не ОтборУстановлен() Тогда
		Возврат;
	КонецЕсли;
	
	РазвернутьЭлементыСоответствующиеОтбору();

	Если Элементы.Макеты.ТекущиеДанные <> Неопределено Тогда
		Если СоответствуетОтбору(Элементы.Макеты.ТекущиеДанные) Тогда
			// Переход к текущей строке, если она не видна после изменения состава видимых строк.
			ТекущаяСтрока = Элементы.Макеты.ТекущаяСтрока;
			Элементы.Макеты.ТекущаяСтрока = 0;
			Элементы.Макеты.ТекущаяСтрока = ТекущаяСтрока;
		Иначе
			ПерейтиКПервомуНайденномуМакету();
		КонецЕсли;
	КонецЕсли;
	
	УстановитьДоступностьКнопокКоманднойПанели();
	
КонецПроцедуры

&НаКлиенте
Процедура РазвернутьЭлементыСоответствующиеОтбору(Ветка = Неопределено)
	
	Если Не ЗначениеЗаполнено(СтрокаПоиска) Тогда
		Возврат;
	КонецЕсли;
	
	Если Ветка = Неопределено Тогда
		Ветка = Макеты;
	КонецЕсли;
	
	Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
		КоллекцияПодчиненныхЭлементов = Элемент.ПолучитьЭлементы();
		Если Элемент.ЕстьЭлементыСоответствующиеОтбору И КоллекцияПодчиненныхЭлементов.Количество() > 0 
			И ЗначениеЗаполнено(КоллекцияПодчиненныхЭлементов[0].Идентификатор) Тогда
			Элементы.Макеты.Развернуть(Элемент.ПолучитьИдентификатор(), Ложь);
			РазвернутьЭлементыСоответствующиеОтбору(Элемент);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры
	
&НаКлиенте
Функция ОтметитьЭлементыСоответствующиеОтбору(Знач Ветка = Неопределено)

	Если Ветка = Неопределено Тогда
		Ветка = Макеты;
	КонецЕсли;
	
	ЕстьЭлементыСоответствующиеОтбору = Не ОтборУстановлен();
	
	Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
		Элемент.СоответствуетОтбору = СоответствуетОтбору(Элемент);
		Элемент.ЕстьЭлементыСоответствующиеОтбору = ОтметитьЭлементыСоответствующиеОтбору(Элемент);
		
		ЕстьЭлементыСоответствующиеОтбору = ЕстьЭлементыСоответствующиеОтбору 
			Или Элемент.СоответствуетОтбору Или Элемент.ЕстьЭлементыСоответствующиеОтбору;
	КонецЦикла;
	
	Возврат ЕстьЭлементыСоответствующиеОтбору;
	
КонецФункции

&НаКлиенте
Функция СоответствуетОтбору(Элемент)
	
	Возврат (Не ЗначениеЗаполнено(СтрокаПоиска) Или СтрНайти(Элемент.СтрокаПоиска, НРег(СокрЛП(СтрокаПоиска))))
		И (Не Элемент.ЭтоГруппа И ПоказыватьИзмененные И Элемент.Изменен 
			И (ПоказыватьИспользуемые И Элемент.Используется Или ПоказыватьНеиспользуемые И Не Элемент.Используется)
			Или ПоказыватьНеизмененные И Не Элемент.Изменен)
		И (Не ЗначениеЗаполнено(ОтборПоЯзыку) Или СтрНайти(Элемент.ДоступныеЯзыки, ОтборПоЯзыку));
	
КонецФункции

&НаКлиенте
Функция ОтборУстановлен()
	
	Возврат ЗначениеЗаполнено(СтрокаПоиска) 
		Или ОтборПоИспользованиюМакета <> "ВсеМакеты"
		Или ЗначениеЗаполнено(ОтборПоЯзыку);
	
КонецФункции

&НаСервере
Процедура ЗаполнитьОбъектыСКомандамиПечати()
	
	Для Каждого ОбъектМетаданных Из УправлениеПечатью.ИсточникиКомандПечати() Цикл
		ОбъектыСКомандамиПечати.Добавить(ОбъектМетаданных.ПолноеИмя());
	КонецЦикла;
	
	ОбъектыСМакетами = Новый Соответствие;
	Для Каждого ОписаниеМакета Из УправлениеПечатью.МакетыПечатныхФорм(Истина) Цикл
		ОбъектыСМакетами.Вставить(ОписаниеМакета.Значение, Истина);
	КонецЦикла;
	
	ОбъектыМетаданных = Новый Массив;
	Для Каждого Объект Из ОбъектыСМакетами Цикл
		Если Объект.Ключ <> Метаданные.ОбщиеМакеты Тогда
			ОбъектыСКомандамиПечати.Добавить(Объект.Ключ.ПолноеИмя());
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Функция ПерейтиКПервомуНайденномуМакету(Знач Ветка = Неопределено)
	
	Если Ветка = Неопределено Тогда
		Ветка = Макеты;
	КонецЕсли;
	
	Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
		Если Элемент.СоответствуетОтбору Тогда
			Элементы.Макеты.ТекущаяСтрока = Элемент.ПолучитьИдентификатор();
			Возврат Истина;
		КонецЕсли;
		Если ПерейтиКПервомуНайденномуМакету(Элемент) Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

&НаСервере
Процедура ПерейтиКЭлементу(Знач ПутьКЭлементу, Знач Ветка = Неопределено)
	
	Если Ветка = Неопределено Тогда
		Ветка = Макеты;
	КонецЕсли;
	
	ЧастиПути = СтрРазделить(ПутьКЭлементу, "/", Ложь);
	Если ЧастиПути.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ИдентификаторТекущейВетки = ЧастиПути[0];
	Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
		Если Элемент.Идентификатор = ИдентификаторТекущейВетки Тогда
			Если ЧастиПути.Количество() = 1 Тогда
				Элементы.Макеты.ТекущаяСтрока = Элемент.ПолучитьИдентификатор();
				Возврат;
			КонецЕсли;
			
			ЗагрузитьПодчиненныеЭлементы(Элемент.ПолучитьИдентификатор());
			
			ЧастиПути.Удалить(0);
			ПутьКЭлементу = СтрСоединить(ЧастиПути, "/");
			ПерейтиКЭлементу(ПутьКЭлементу, Элемент);
			Возврат;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПутьКМакетуВДереве(Макет)
	
	Если Макет = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	Возврат ПутьКМакетуВДереве(Макет.ПолучитьРодителя()) + "/" + Макет.Идентификатор;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ОчиститьКэш(ИмяОбъектаМетаданных, ОбъектыСКомандамиПечати)
	
	НайденныйЭлемент = ОбъектыСКомандамиПечати.НайтиПоЗначению(ИмяОбъектаМетаданных);
	Если НайденныйЭлемент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	НайденныйЭлемент.Представление = "";
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьСписокМакетов()
	
	Если ВыполняетсяЗагрузкаДанных Или Не ЕстьОбъектыБезКэша() Тогда
		Возврат;
	КонецЕсли;
	
	ВыполняетсяЗагрузкаДанных = Истина;
	Элементы.ВыполняетсяПоиск.Видимость = Истина;
	
	ДлительнаяОперация = НачатьВыполнениеНаСервере();
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультат", ЭтотОбъект);
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
	
КонецПроцедуры

&НаСервере
Функция НачатьВыполнениеНаСервере()
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
	Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, 
		"РегистрыСведений.ПользовательскиеМакетыПечати.МакетыОбъектов", ОбъектыБезКэша());
	
КонецФункции

&НаКлиенте
Процедура ОбработатьРезультат(Результат, ДополнительныеПараметры) Экспорт
	
	ВыполняетсяЗагрузкаДанных = Ложь;
	Элементы.ВыполняетсяПоиск.Видимость = Ложь;
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОбработатьРезультатНаСервере(Результат.АдресРезультата);
	ОбновитьВидимостьМакетов();
	
КонецПроцедуры 

&НаСервере
Процедура ОбработатьРезультатНаСервере(АдресРезультата)
	
	МакетыОбъектов = ПолучитьИзВременногоХранилища(АдресРезультата); // См. РегистрыСведений.ПользовательскиеМакетыПечати.МакетыОбъектов
	ЗаписатьКэшМакетов(МакетыОбъектов);
	
	ЗагрузитьВетку(Макеты);
	
КонецПроцедуры

&НаКлиенте
Функция ЕстьОбъектыБезКэша()
	
	Для Каждого Элемент Из ОбъектыСКомандамиПечати Цикл
		Если Не ЗначениеЗаполнено(Элемент.Представление) Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

&НаСервере
Функция ОбъектыБезКэша()
	
	Результат = Новый Массив;
	Для Каждого Элемент Из ОбъектыСКомандамиПечати Цикл
		Если Не ЗначениеЗаполнено(Элемент.Представление) Тогда
			Если Элемент.Значение = "ОбщиеМакеты" Тогда
				Результат.Добавить(Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка());
			Иначе
				Результат.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Элемент.Значение));
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ЗаписатьКэшМакетов(МакетыОбъектов)
	
	ИдентификаторыОбъектовМетаданных = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ОбъектыСКомандамиПечати.ВыгрузитьЗначения(), Ложь);

	Для Каждого Элемент Из ОбъектыСКомандамиПечати Цикл
		Если ЗначениеЗаполнено(Элемент.Представление) Тогда
			Продолжить;
		КонецЕсли;
		
		Если Элемент.Значение = "ОбщиеМакеты" Тогда
			Владелец = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка();
		Иначе
			Владелец = ИдентификаторыОбъектовМетаданных[Элемент.Значение];
		КонецЕсли;
		
		НайденныеМакеты = МакетыОбъектов.НайтиСтроки(Новый Структура("Владелец", Владелец));
		МакетыОбъекта = МакетыОбъектов.Скопировать(НайденныеМакеты);
		Элемент.Представление = ОбщегоНазначения.ЗначениеВСтрокуXML(МакетыОбъекта);
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьВетку(Ветка)
	
	Для Каждого Элемент Из Ветка.ПолучитьЭлементы() Цикл
		ЗагрузитьПодчиненныеЭлементы(Элемент.ПолучитьИдентификатор());
		ЗагрузитьВетку(Элемент);
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти
